home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / mercury / menu.c < prev    next >
Text File  |  1995-01-09  |  8KB  |  328 lines

  1. /*
  2.  
  3. MercuryInstaller メニュールーチン
  4.  
  5. */
  6.  
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<string.h>
  10. #include<farstr.h>
  11.  
  12. #include"mercury.h"
  13. /*---------------------------------定数--------------------------------------*/
  14. #define    KEYWORD_ONELINE        4    /* 1行に表示するキーワードの数       */
  15. #define    KEYWORD_LINENUM        (CEIL(MEMBERSOF(Keyword),KEYWORD_ONELINE))
  16.                     /* 画面上でキーワード表示に使う行数  */
  17. #define    KEYWORD_STARTYPOS    3    /* キーワード表示開始番号            */
  18. #define    KEYWORD_XWIDTH        (CON_XWIDTH/KEYWORD_ONELINE)
  19.                     /* ひとつのキーワードの表示幅        */
  20. #define    TABLE_STARTYPOS        (KEYWORD_STARTYPOS+KEYWORD_LINENUM+1)
  21.                     /* 候補リストの表示開始位置          */
  22. #define    TABLE_LINENUM        (CON_YWIDTH-TABLE_STARTYPOS)
  23.                     /* 候補リストの行数                  */
  24. /*------------------------------グローバル変数-------------------------------*/
  25. static    struct DATA far    **Table;    /* 候補リスト                        */
  26.  
  27. static    int    Table_num;        /* 候補作品数                        */
  28. static    int    Table_cursoroffset;    /* 候補リストの中のカーソルの表示位置*/
  29. static    int    Table_cursorstart;    /* 表示されている作品の実際の番号    */
  30.  
  31. static    KEYWORD_T Selected_keyword;    /* 選択されたキーワード              */
  32. static    int    Keyword_cursorpos;    /* キーワード表示の中のカーソルの位置*/
  33. /*---------------------------候補リストの画面表示----------------------------*/
  34. #define    table_screeninit() do    /* インライン関数 */    \
  35. {                            \
  36.     int    i;                    \
  37.     for    (i=0 ; i<TABLE_LINENUM ; i++)        \
  38.         showtable(i);                \
  39. } while(0)                        \
  40.  
  41. static    void    showtable(int offset)
  42. {
  43.     char    buf[80];
  44.  
  45.     printf("\033[%d;1f",TABLE_STARTYPOS+offset);
  46.  
  47.     if    (Table_cursoroffset==offset)
  48.         printf("\033[7m");
  49.  
  50.     if    (Table_cursorstart+offset<Table_num)
  51.     {
  52.         far_strcpy(buf,Table[Table_cursorstart+offset]->title);
  53.         printf("%-*s",TITLEWIDTH,buf);
  54.         far_strcpy(buf,Table[Table_cursorstart+offset]->make);
  55.         printf("%-*s",MAKEWIDTH,buf);
  56.     }
  57.     else
  58.         printf("\033[2K");
  59.  
  60.     printf("\033[0m");
  61. }
  62.  
  63. static    void    table_scrollup(void)    /* Table_cursoroffset==0と仮定 */
  64. {
  65.     if    (Table_cursorstart==0)
  66.         return;
  67.  
  68.     Table_cursoroffset = -1;
  69.     showtable(0);
  70.  
  71.     Table_cursorstart--;
  72.     printf("\033[%d;1f",TABLE_STARTYPOS);
  73.  
  74.     if    (Flag_isfmesc)    printf("\033E");
  75.     else            printf("\033[L");
  76.  
  77.     printf("\033[%d;1f\033[2K",TABLE_STARTYPOS+TABLE_LINENUM);
  78.  
  79.     Table_cursoroffset = 0;
  80.     showtable(0);
  81. }
  82.  
  83. static    void    table_scrolldown(void)    /*Table_cursoroffset==TABLE_LINENUM-1*/
  84. {                    /*と仮定                             */
  85.     if    (Table_cursorstart+1>=Table_num)
  86.         return;
  87.  
  88.     Table_cursoroffset = -1;
  89.     showtable(TABLE_LINENUM-1);
  90.  
  91.     Table_cursorstart++;
  92.     printf("\033[%d;1f",TABLE_STARTYPOS);
  93.  
  94.     if    (Flag_isfmesc)    printf("\033R");
  95.     else            printf("\033[M");
  96.  
  97.     Table_cursoroffset = TABLE_LINENUM-1;
  98.     showtable(TABLE_LINENUM-1);
  99. }
  100. /*---------------------------候補リストを初期化------------------------------*/
  101. static    void    init_table(void)
  102. {
  103.     struct    DATA    far    *p;
  104.  
  105.     Table_num = 0;
  106.  
  107.     printf("\033[%d;1fしばらくお待ちください",CON_YWIDTH);
  108.  
  109.     for    (p=Data ; p!=NULL ; p=p->next)
  110.     {
  111.         if    ((p->keywords&Selected_keyword)!=Selected_keyword)
  112.             continue;
  113.  
  114.         if    (patternmatch(p->title) || patternmatch(p->make))
  115.             Table[Table_num++] = p;
  116.     }
  117.  
  118.     printf("\033[2K");
  119.  
  120.     Table_cursorstart = 0;
  121.     if    (Table_cursoroffset>0)
  122.         Table_cursoroffset = 0;
  123.  
  124.     table_screeninit();
  125. }
  126. /*------------------------------キーワードの表示-----------------------------*/
  127. static    void    showkeyword(int n)
  128. {
  129.     printf("\033[%d;%df",n/KEYWORD_ONELINE+KEYWORD_STARTYPOS,
  130.                 n%KEYWORD_ONELINE*KEYWORD_XWIDTH+1);
  131.  
  132.     if    (n==Keyword_cursorpos)    putchar('<');
  133.     else                putchar(' ');
  134.  
  135.     if    (Selected_keyword & (1UL<<n))
  136.         printf("\033[7m");
  137.  
  138.     printf("%-*s\033[0m",KEYWORD_XWIDTH-2,Keyword[n]);
  139.  
  140.     if    (n==Keyword_cursorpos)    putchar('>');
  141.     else                putchar(' ');
  142. }
  143. /*----------------------------画面全体の初期化-------------------------------*/
  144. static    void    menu_screeninit(void)
  145. {
  146.     int    i;
  147.  
  148.     showcursor(0);
  149.  
  150.     printf("\033[2JMercuryInstaller Version " VERSION "  Copyright (c) Delmonta "__DATE__);
  151.  
  152.     for    (i=0 ; i<Keywordnum ; i++)
  153.         showkeyword(i);
  154.  
  155.     printf("\033[7;36m\033[%d;1f%-*s\033[7;37m \033[7;36m%-*s\033[0m",
  156.         TABLE_STARTYPOS-1,TITLEWIDTH-1,"作 品 名",MAKEWIDTH,"作 者");
  157. }
  158. /*--------------------------------検索機能-----------------------------------*/
  159. static    void    menu_search(void)
  160. {
  161.     static    char    pattern[64] = "";
  162.     auto    char    buf[64];
  163.  
  164.     strcpy(buf,pattern);
  165.  
  166.     showcursor(1);
  167.     printf("\033[%d;1f検索する文字列>",CON_YWIDTH);
  168.     if    (ds_strinput(buf,sizeof(buf)-1))
  169.     {
  170.         strcpy(pattern,buf);
  171.         patternmatch_init(pattern);
  172.         init_table();
  173.     }
  174.  
  175.     showcursor(0);
  176.     printf("\033[%d;1f\033[2K",CON_YWIDTH);
  177.                     /* これは本来は不要だが、モジュールの */
  178.                     /* 独立性を保つという意味で書いておく*/
  179. }
  180. /*-------------------------候補の中から作品を選択----------------------------*/
  181. static    void    select(void)
  182. {
  183.     static    int    cursoroffset_save = 0;
  184.  
  185.     int    keypos_save = Keyword_cursorpos;
  186.  
  187.     Keyword_cursorpos = -1;
  188.     showkeyword(keypos_save);
  189.  
  190.     if    (Table_num==0)
  191.     {
  192.         putchar('\a');
  193.         return;
  194.     }
  195.  
  196.     Table_cursoroffset = cursoroffset_save;
  197.     showtable(Table_cursoroffset);
  198.  
  199.     while    (1)
  200.     {
  201.         switch    (ds_getch())
  202.         {
  203.         case FKEY_UP:
  204.             if    (Table_cursoroffset>0)
  205.             {
  206.                 showtable(Table_cursoroffset--);
  207.                 showtable(Table_cursoroffset);
  208.             }
  209.             else
  210.                 table_scrollup();
  211.  
  212.             break;
  213.         case FKEY_DOWN:
  214.             if    (Table_cursoroffset<TABLE_LINENUM-1)
  215.             {
  216.                 showtable(Table_cursoroffset++);
  217.                 showtable(Table_cursoroffset);
  218.             }
  219.             else
  220.                 table_scrolldown();
  221.  
  222.             break;
  223.         case FKEY_RIGHT:
  224.             Table_cursorstart += TABLE_LINENUM;
  225.             if    (Table_cursorstart>=Table_num)
  226.                 Table_cursorstart = Table_num-1;
  227.  
  228.             table_screeninit();
  229.             break;
  230.         case FKEY_LEFT:
  231.             Table_cursorstart -= TABLE_LINENUM;
  232.             if    (Table_cursorstart<0)
  233.                 Table_cursorstart = 0;
  234.  
  235.             table_screeninit();
  236.             break;
  237.         case FKEY_CR:
  238.             if    (Table_cursorstart+Table_cursoroffset>=Table_num)
  239.                 break;
  240.  
  241.             textviewer(Table[Table_cursorstart+Table_cursoroffset]);
  242.             menu_screeninit();
  243.             table_screeninit();
  244.             break;
  245.         case FKEY_F1:
  246.             menu_search();
  247.             break;
  248.         case FKEY_ESC:
  249.         case FKEY_F10:
  250.             cursoroffset_save = Table_cursoroffset;
  251.             Table_cursoroffset = -1;
  252.             showtable(cursoroffset_save);
  253.             Keyword_cursorpos = keypos_save;
  254.             showkeyword(Keyword_cursorpos);
  255.             return;
  256.         }
  257.     }
  258. }
  259. /*-------------------------メニューのメインルーチン--------------------------*/
  260. extern    void    menu(void)
  261. {
  262.     int    c;
  263.  
  264.     if    ((Table=malloc(sizeof(*Table)*Datanum))==NULL)
  265.     {
  266.         printf("メモリ不足です.\n");
  267.         exit(1);
  268.     }
  269.  
  270.     menu_screeninit();
  271.     init_table();
  272.  
  273.     while    (1)
  274.     {
  275.         switch    (ds_getch())
  276.         {
  277.         case FKEY_UP:
  278.             if    (Keyword_cursorpos>=KEYWORD_ONELINE)
  279.             {
  280.                 showkeyword(Keyword_cursorpos-=4);
  281.                 showkeyword(Keyword_cursorpos+4);
  282.             }
  283.             break;
  284.         case FKEY_DOWN:
  285.             if    (Keyword_cursorpos<Keywordnum-KEYWORD_ONELINE)
  286.             {
  287.                 showkeyword(Keyword_cursorpos+=4);
  288.                 showkeyword(Keyword_cursorpos-4);
  289.             }
  290.             break;
  291.         case FKEY_RIGHT:
  292.             if    (Keyword_cursorpos<Keywordnum-1)
  293.             {
  294.                 showkeyword(Keyword_cursorpos++);
  295.                 showkeyword(Keyword_cursorpos);
  296.             }
  297.             break;
  298.         case FKEY_LEFT:
  299.             if    (Keyword_cursorpos>0)
  300.             {
  301.                 showkeyword(Keyword_cursorpos--);
  302.                 showkeyword(Keyword_cursorpos);
  303.             }
  304.             break;
  305.         case ' ':
  306.             Selected_keyword ^= 1UL<<Keyword_cursorpos;
  307.             showkeyword(Keyword_cursorpos);
  308.             init_table();
  309.             break;
  310.         case FKEY_F10:
  311.         case FKEY_ESC:
  312.         case FKEY_BREAK:
  313.             if    ((c=putmessage("終了しますか(y/n)"))=='Y' ||
  314.                             c=='y')
  315.             {
  316.                 showcursor(1);
  317.                 printf("\033[2J");
  318.                 exit(0);
  319.             }
  320.             break;
  321.         case FKEY_CR:
  322.             select();
  323.             break;
  324.         }
  325.     }
  326. }
  327. /*------------------------------ End of MENU.C ------------------------------*/
  328.